/*
 * MAStickChart.java
 * Android-Charts
 *
 * Created by limc on 2011/05/29.
 *
 * Copyright 2011 limc.cn All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package cn.limc.ohoscharts.view;


import cn.limc.ohoscharts.entity.DateValueEntity;
import cn.limc.ohoscharts.entity.LineEntity;
import cn.limc.ohoscharts.axis.IAxis;
import ohos.agp.components.AttrSet;
import ohos.agp.components.Component;
import ohos.agp.render.Canvas;
import ohos.agp.render.Paint;
import ohos.agp.utils.Color;
import ohos.agp.utils.Point;
import ohos.app.Context;

import java.util.List;

/**
 * <p>
 * MAStickChart is inherits from StickChart which can display moving average
 * lines on this graph
 * </p>
 * <p>
 * MAStickChartはグラフの一種です、移動平均線など分析線がこのグラフで表示は可能です。
 * </p>
 * <p>
 * MAStickChart继承于StickChart的，可以在StickChart基础上显示移动平均等各种分析指标数据。
 * </p>
 *
 * @author limc
 * @version v1.0 2011/05/30 15:10:17
 * @see StickChart
 */
public class MAStickChart extends StickChart {

  /**
   * <p>
   * data to draw lines
   * </p>
   * <p>
   * ラインを書く用データ
   * </p>
   * <p>
   * 绘制线条用的数据
   * </p>
   */
  private List<LineEntity<DateValueEntity>> linesData;

  /*
   * (non-Javadoc)
   *
   * @param context
   *
   * @see cn.limc.ohoscharts.view.GridChart#GridChart(Context)
   */
  public MAStickChart(Context context) {
    super(context);
  }

  /*
   * (non-Javadoc)
   *
   * @param context
   *
   * @param attrs
   *
   * @param defStyle
   *
   * @see cn.limc.ohoscharts.view.GridChart#GridChart(Context,
   * AttributeSet, int)
   */
  public MAStickChart(Context context, AttrSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  /*
   * (non-Javadoc)
   *
   * @param context
   *
   * @param attrs
   *
   * @see cn.limc.ohoscharts.view.GridChart#GridChart(Context,
   * AttributeSet)
   */
  public MAStickChart(Context context, AttrSet attrs) {
    super(context, attrs);
  }

  @Override
  protected void calcDataValueRange() {
    super.calcDataValueRange();

    double maxValue = this.maxValue;
    double minValue = this.minValue;
    // 逐条输出MA线
    for (int i = 0; i < this.linesData.size(); i++) {

      LineEntity<DateValueEntity> line = (LineEntity<DateValueEntity>) linesData
          .get(i);
      if (line == null) {
        continue;
      }
      if (line.isDisplay() == false) {
        continue;
      }
      List<DateValueEntity> lineData = line.getLineData();
      if (lineData == null) {
        continue;
      }

      // 判断显示为方柱或显示为线条
      for (int j = 0; j < this.maxSticksNum; j++) {
        DateValueEntity entity;
        if (axisY.getPosition() == IAxis.AXIS_Y_POSITION_LEFT) {
          entity = line.getLineData().get(j);
        } else {
          entity = line.getLineData().get(lineData.size() - 1 - j);
        }
        if (entity.getValue() < minValue) {
          minValue = entity.getValue();
        }
        if (entity.getValue() > maxValue) {
          maxValue = entity.getValue();
        }
      }
    }
    this.maxValue = maxValue;
    this.minValue = minValue;
  }

  /*
   * (non-Javadoc)
   *
   * <p>Called when is going to draw this chart<p> <p>チャートを書く前、メソッドを呼ぶ<p>
   * <p>绘制图表时调用<p>
   *
   * @param canvas
   *
   * @see ohos.view.View#onDraw(ohos.graphics.Canvas)
   */

  @Override
  public void onDraw(Component component, Canvas canvas) {
    super.onDraw(component, canvas);
    // draw lines
    if (null != this.linesData) {
      if (0 != this.linesData.size()) {
        drawLines(canvas);
      }
    }
  }


  /**
   * <p>
   * draw lines
   * </p>
   * <p>
   * ラインを書く
   * </p>
   * <p>
   * 绘制线条
   * </p>
   *
   * @param canvas
   */
  protected void drawLines(Canvas canvas) {
    if (null == this.linesData) {
      return;
    }
    // distance between two points
    float lineLength = dataQuadrant.getPaddingWidth() / maxSticksNum - stickSpacing;
    // start point‘s X
    float startX;

    // draw MA lines
    for (int i = 0; i < linesData.size(); i++) {
      LineEntity<DateValueEntity> line = (LineEntity<DateValueEntity>) linesData
          .get(i);
      if (line == null) {
        continue;
      }
      if (line.isDisplay() == false) {
        continue;
      }
      List<DateValueEntity> lineData = line.getLineData();
      if (lineData == null) {
        continue;
      }
      Paint mPaint = new Paint();
      mPaint.setColor(new Color(line.getLineColor()));
      mPaint.setAntiAlias(true);

      // start point
      Point ptFirst = null;

      if (axisY.getPosition() == IAxis.AXIS_Y_POSITION_LEFT) {
        // set start point’s X
        startX = dataQuadrant.getPaddingStartX() + lineLength / 2;

        for (int j = 0; j < lineData.size(); j++) {
          float value = lineData.get(j).getValue();
          // calculate Y
          float valueY = (float) ((1f - (value - minValue)
              / (maxValue - minValue)) * dataQuadrant.getPaddingHeight())
              + dataQuadrant.getPaddingStartY();

          // if is not last point connect to previous point
          if (j > 0) {
            canvas.drawLine(ptFirst.getPointX(), ptFirst.getPointY(), startX, valueY,
                mPaint);
          }
          // reset
          ptFirst = new Point(startX, valueY);
          startX = startX + stickSpacing + lineLength;
        }
      } else {
        // set start point’s X
        startX = dataQuadrant.getPaddingEndX() - lineLength / 2;
        for (int j = lineData.size() - 1; j >= 0; j--) {
          float value = lineData.get(j).getValue();
          // calculate Y
          float valueY = (float) ((1f - (value - minValue)
              / (maxValue - minValue)) * dataQuadrant.getPaddingHeight())
              + dataQuadrant.getPaddingStartY();

          // if is not last point connect to previous point
          if (j < lineData.size() - 1) {
            canvas.drawLine(ptFirst.getPointX(), ptFirst.getPointY(), startX, valueY,
                mPaint);
          }
          // reset
          ptFirst = new Point(startX, valueY);
          startX = startX - stickSpacing - lineLength;
        }
      }
    }
  }

  /**
   * @return the lineData
   */
  public List<LineEntity<DateValueEntity>> getLinesData() {
    return linesData;
  }

  /**
   * @param linesData the linesData to set
   */
  public void setLinesData(List<LineEntity<DateValueEntity>> linesData) {
    this.linesData = linesData;
  }
}
